home *** CD-ROM | disk | FTP | other *** search
- /* Open and close files for bison,
- Copyright (C) 1984, 1986 Bob Corbett and Free Software Foundation, Inc.
-
- BISON is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY. No author or distributor accepts responsibility to anyone
- for the consequences of using it or for whether it serves any
- particular purpose or works at all, unless he says so in writing.
- Refer to the BISON General Public License for full details.
-
- Everyone is granted permission to copy, modify and redistribute BISON,
- but only under the conditions described in the BISON General Public
- License. A copy of this license is supposed to have been given to you
- along with BISON so you can know your rights and responsibilities. It
- should be in a file named COPYING. Among other things, the copyright
- notice and this notice must be preserved on all copies.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
-
- /*
- * Port to PC by Whit Gregg
- * Nourse, Gregg & Browne, Inc.
- * 1 Horizon Road
- * Fort Lee, NJ 07024
- */
-
-
- #include <stdio.h>
- #include <stdlib.h> /* WG */
- #include <string.h> /* WG */
- #include "files.h"
- #include "new.h"
- #include "gram.h"
- #include "func.h" /* WG */
-
- FILE * finput = NULL;
- FILE *foutput = NULL;
- FILE *fdefines = NULL;
- FILE *ftable = NULL;
- FILE *fattrs = NULL;
- FILE *fguard = NULL;
- FILE *faction = NULL;
- FILE *fparser = NULL;
-
- /* FILE *fparser1 = NULL; JF we don't need this anymore */
-
- char *infile;
- char *outfile;
- char *defsfile;
- char *tabfile;
- char *attrsfile;
- char *guardfile;
- char *actfile;
- char *tmpattrsfile;
- char *tmptabfile;
-
- /* JF nobody really uses these */
- /* char *pfile;
- char *pfile1; */
-
- char *mktemp(); /* So the compiler won't complain */
- FILE *tryopen(); /* This might be a good idea */
-
- extern int verboseflag;
- extern int definesflag;
- int fixed_outfiles = 0;
-
-
-
- char *
- stringappend(string1, end1, string2)
- char *string1;
- int end1;
- char *string2;
- {
- register char *ostring;
- register char *cp, *cp1;
- register int i;
-
- cp = string2;
- i = 0;
- while (*cp++)
- i++;
-
- ostring = NEW2(i + end1 + 1, char);
-
- cp = ostring;
- cp1 = string1;
- for (i = 0; i < end1; i++)
- *cp++ = *cp1++;
-
- cp1 = string2;
- while (*cp++ = *cp1++);
-
- return ostring;
- }
-
-
- /* JF this has been hacked to death. Nowaday it sets up the file names for
- the output files, and opens the tmp files and the parser */
- void
- openfiles()
- { /* WG */
- char *name_base;
- register int i;
- register char *cp;
- char *tmp_dir; /* WG */
- char stemp[64]; /* WG */
-
- name_base = fixed_outfiles ? "yyy" : infile;
- tmp_dir = getenv("TMP");/* WG */
- if (tmp_dir == NULL)
- tmp_dir = ""; /* WG */
-
- cp = name_base;
- i = 0;
- while (*cp++)
- i++;
-
- cp -= 2;
-
- if (*cp-- == 'y' && *cp == '.')
- i -= 2;
-
-
- finput = tryopen(infile, "r");
-
- fparser = tryopen(PFILE1, "r");
-
- if (verboseflag) {
- outfile = stringappend(name_base, i,OUTPUT_EXTENSION); /* WG */
- foutput = tryopen(outfile, "w");
- }
-
- if (definesflag) {
- defsfile = stringappend(name_base,i,DEFINES_EXTENSION); /* WG */
- fdefines = tryopen(defsfile, "w");
- }
-
- strcpy(stemp, tmp_dir); /* WG */
- strcat(stemp, "acXXXXXX"); /* WG */
- actfile = mktemp(stemp);/* WG */
- faction = tryopen(actfile, "w+");
- unlink(actfile);
-
- strcpy(stemp, tmp_dir); /* WG */
- strcat(stemp, "atXXXXXX"); /* WG */
- tmpattrsfile = mktemp(stemp); /* WG */
- fattrs = tryopen(tmpattrsfile, "w+");
- unlink(tmpattrsfile);
-
- strcpy(stemp, tmp_dir); /* WG */
- strcat(stemp, "tbXXXXXX"); /* WG */
- tmptabfile = mktemp(stemp); /* WG */
- ftable = tryopen(tmptabfile, "w+");
- unlink(tmptabfile);
- tabfile = stringappend(name_base, i,TABLE_EXTENSION); /* WG */
-
- /* These are opened by open_extra_files, if at all */
- attrsfile = stringappend(name_base, i,ATTRIBUTE_EXTENSION); /* WG */
- guardfile = stringappend(name_base, i,GUARD_EXTENSION); /* WG */
-
- }
-
-
-
- /* open the output files needed only for the semantic parser.
- This is done when %semantic_parser is seen in the declarations section. */
- void
- open_extra_files()
- { /* WG */
- FILE *ftmp;
- int c;
-
- /* JF change open parser file */
- fclose(fparser);
- fparser = tryopen(PFILE, "r");
-
- /* JF change from inline attrs file to separate one */
- ftmp = tryopen(attrsfile, "w");
- rewind(fattrs);
- while ((c = getc(fattrs)) != EOF) /* Thank god for buffering */
- putc((char) c, ftmp); /* WG */
- fclose(fattrs);
- fattrs = ftmp;
-
- fguard = tryopen(guardfile, "w");
-
- }
-
- /*
- * JF to make file opening easier. This func tries to open file NAME with
- * mode MODE, and prints an error message if it fails.
- */
- FILE *
- tryopen(name, mode)
- char *name;
- char *mode;
- {
- FILE *ptr;
-
- ptr = fopen(name, mode);
- if (ptr == NULL) {
- fprintf(stderr, "bison: ");
- perror(name);
- done(2);
- }
- return ptr;
- }
-
- void
- done(k) /* WG */
- int k;
- {
- if (faction)
- fclose(faction);
-
- if (fattrs)
- fclose(fattrs);
-
- if (fguard)
- fclose(fguard);
-
- if (finput)
- fclose(finput);
-
- if (fparser)
- fclose(fparser);
-
- /* JF we don't need this anymore
- if (fparser1)
- fclose(fparser1); */
-
- if (foutput)
- fclose(foutput);
-
- /* JF write out the output file */
- if (k == 0 && ftable) {
- FILE *ftmp;
- register int c;
-
- ftmp = tryopen(tabfile, "w");
- rewind(ftable);
- while ((c = getc(ftable)) != EOF)
- putc((char) c, ftmp); /* WG */
- fclose(ftmp);
- fclose(ftable);
- }
-
- exit(k);
- }